package com.atguigu.guli.service.edu.controller.admin;


import com.atguigu.guli.service.base.result.R;
import com.atguigu.guli.service.base.result.ResultCodeEnum;
import com.atguigu.guli.service.edu.entity.Teacher;
import com.atguigu.guli.service.edu.entity.query.TeacherSearch;
import com.atguigu.guli.service.edu.mapper.TeacherMapper;
import com.atguigu.guli.service.edu.service.OssFeignClient;
import com.atguigu.guli.service.edu.service.TeacherService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 讲师 前端控制器
 * </p>
 *
 * @author atguigu
 * @since 2021-07-27
 */
 //允许跨域访问
@RestController
@RefreshScope//表示动态加载nacos配置中心的配置
@Api(tags = "讲师管理模块")
@RequestMapping("/admin/edu/teacher")
@Slf4j
public class AdminTeacherController {
    @Autowired
    TeacherService teacherService;
    @Autowired
    OssFeignClient ossFeignClient;
    //测试远程访问
    @GetMapping("test")
    public R test(){
        R test = ossFeignClient.test(ResultCodeEnum.EXCEL_DATA_IMPORT_ERROR);
        return test;
    }

    @GetMapping("test1")
    public R test1(){
        log.error("这是手写的");
        log.error("当前打印的日志级别：{},时间为{}" , "error",new Date());
        return R.ok();
    }

    //7、批量删除
    /*
        前端需要提交多个id值：
            方式1：请求参数方式提交 url?id=1&id=2&id=3
                        url?ids=1,2,3
                        @RequestParam List<String> ids
            方式2：请求体 json数组的方式提交 [ 1,2,3]

     */
    @DeleteMapping("batchDel")
//    public R batchDel(@RequestParam List<String> ids){ //如果获取请求参数使用的类型为集合类型 必须使用@RequestParam注解
    public R batchDel(@RequestBody List<String> ids){
//        System.out.println("ids = " + ids);
        //查询要批量删除的讲师非空的头像地址集合
        // 参考 阿里云oss的文档 在service-oss中编写一个批量删除的接口
        teacherService.removeByIds(ids);
        return R.ok();
    }



    //2、带条件的分页查询:  pageNum  pageSize
    /*
        参数携带的方式
        1、如果每次请求都需要携带的参数 参数类型简单  ，可以使用路径参数
            list/{pageNum}/{pageSize}
            getById/{id}
            @PathVariable("pageNum")  Integer pageNum
            以后访问时 必须指定路径参数 才可以访问路径映射的方法
        2、get或者post方式 可以以请求参数的方式携带
            url?p1=v1&p2=v2&p2=v3
            一般是get方式使用
         3、以json的形式 在请求体中携带参数[get方式不能使用：get的请求报文没有请求体]
            请求首行
            请求头
            请求空行
            请求体[可以设置要提交的数据：可以是json 可以是任意类型的字符串或者文件]

     */
    @ApiOperation(value = "查询讲师分页列表")
    @GetMapping("list/{pageNum}/{pageSize}")
    public R listPage(@ApiParam(value = "页码" , required = true ,defaultValue = "1") @PathVariable("pageNum") Integer pageNum ,
                      @ApiParam(value = "每页显示条数" , required = true ,defaultValue = "3") @PathVariable("pageSize") Integer pageSize,
                      TeacherSearch teacherSearch){
        Page<Teacher> page = teacherService.selectPageByCondition(pageNum , pageSize , teacherSearch);

        //records:代表page中的分页数据集合 ，total：总记录条数
        return R.ok().data("page" , page);
    }
    //3、新增讲师
    @ApiOperation(value = "新增讲师")
    @PostMapping("save")
    // Teacher teacher: 不适用注解 表示pojo入参  从请求参数中获取 bean的属性名为key的属性值设置给pojo的属性
    public R saveTeacher(@RequestBody Teacher teacher){
        //@ResponseBody 将响应的对象转为json字符串
        //@RequestBody 获取请求体json内容转为 teacher对象
        boolean b = teacherService.save(teacher);
        if(b){
            return R.ok();
        }else{
            return R.error();
        }
    }
    //4、删除讲师
    @ApiOperation(value = "根据id删除讲师")
    @DeleteMapping("deleteById/{id}")
    public R deleteById(@PathVariable("id") String id){// String不能转为Integer类型
       //删除讲师的同时删除讲师头像
        //远程访问service-oss  删除文件的接口：文件地址  模块avatar
        Teacher teacher = teacherService.getById(id);
        String path = teacher.getAvatar();
        if(!StringUtils.isEmpty(path)){
            ossFeignClient.deleteFile(path , "avatar");

        }
        boolean b = teacherService.removeById(id);

        if(b){
            return R.ok();
        }
        return R.error().message("记录不存在");
    }
    //5、根据id查询讲师
    @ApiOperation(value = "根据id查询讲师")
    @GetMapping("getById/{id}")
    public R getById(@ApiParam("讲师id") @PathVariable("id") String id){
        Teacher teacher = teacherService.getById(id);
        return R.ok().data("item",teacher);
    }
    //6、更新讲师
    @ApiOperation(value = "更新讲师")
    @PutMapping("updateById")
    public R updateById(@RequestBody Teacher teacher){
        teacherService.updateById(teacher);
        return R.ok();
    }

    //1、查询所有
    @ApiOperation(value = "查询所有讲师")
    @GetMapping("list")
    public R listAll(){
        List<Teacher> teachers = null;
        teachers = teacherService.list();
//        log.debug("当前打印的日志级别：{},时间为{}" , "debug",new Date());//测试时使用
//        log.info("当前打印的日志级别：{},时间为{}" , "info",new Date());//开发环境使用
//        log.warn("当前打印的日志级别：{},时间为{}" , "warn",new Date());//生产环境常用
//        log.error("当前打印的日志级别：{},时间为{}" , "error",new Date());
//        fetal:崩溃级别
        return R.ok().data("items" , teachers);
    }
    @Value("${firstnacos}")
    String id;

    @Value("${secondnacos}")
    String id2;

    @Value("${myredishost}")
    String redisHost;
    @GetMapping("test2")  //nacos中默认加载服务名，服务名.properties，服务名-dev.properties
    public void test2(){
        System.out.println("firstnacos="+id);
        System.out.println("secondnacos="+id2);
        System.out.println("myredishost="+redisHost);
    }

}

